<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/ajax.js"></script>
</head>

<body>

</body>
<script>
    // 传统异步的解决方式
    // 1. 事件(ajax => xhr.onreadystatechange  btn.onclick)
    // 2. 回调函数

    // Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大


    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。Promise 提供统一的 API，各种异步操作都可以用同样的方法进行处理。

    // 如何创建Promise对象(Promise实例)  => 通过构造函数创建出来的对象(new XXX => 实例化对象)
    // 构造函数创建  =>  Promise对象(Promise实例)

    // var p = new Promise(function () {
    //     // Promise接收一个回调函数 => 容器 => 里面保存着某个未来才会结束的事件（通常是一个异步操作,同步也可以)
    //     // 此函数属于同步任务 => 调用new Promise()时立即执行
    //     console.log(11111);
    // });
    // console.log(p);

    // p = {
    //     [[PromiseState]]:"pending",   Promise的状态
    //     [[PromiseResult]]:undefined   Promise的结果
    // }

    // Promise对象(实例)的状态
    // pending   进行中
    // fulfilled 已成功(resolved)
    // rejected  已失败

    // Promise中提供了改变状态的方法 resolve reject
    // resolve()  将Promise对象(实例)的状态 由pending(进行中) 改为fulfilled(已成功)
    // reject()   将Promise对象(实例)的状态 由pending(进行中) 改为rejected(已失败)

    // resolve() reject() 可以接收一个参数 => 在状态改变时存储对应的数据

    // Promise对象有以下两个特点。

    // （1）对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。这也是Promise这个名字的由来，它的英语意思就是“承诺”，表示其他手段无法改变。  (用户根据异步操作的结果 调用resolve() reject() 改变状态  =>  其他任何操作都不会改变)

    // （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）
    // 注意，为了行文方便，本章后面的resolved统一只指fulfilled状态，不包含rejected状态。


    // 优点:
    // 有了Promise对象，就可以将异步操作以同步操作的流程表达出来，避免了层层嵌套的回调函数。此外，Promise对象提供统一的接口，使得控制异步操作更加容易。


    /* debugger;

    var p = new Promise(function (resolve, reject) { // 形参
        // Promise接收一个回调函数 => 容器 => 里面保存着某个未来才会结束的事件（通常是一个异步操作,同步也可以)
        // 此函数属于同步任务 => 调用new Promise()时立即执行
        console.log(111111);

        setTimeout(function () {
            debugger;
            // var num = Math.random();
            var num = 0.1;
            console.log(num);

            if (num > 0.5) {
                // console.log("正面:不拖堂");
                resolve("不拖堂");  //  {<fulfilled>:不拖堂}
            } else {
                // console.log("反面:拖堂");
                reject("拖堂");  // {<rejected>:拖堂}
            }
            console.log("60:", p);

        }, 2000)

    });
    console.log("65:", p); // {<pending>:undefined} */



    debugger;

    var p = new Promise(function (resolve, reject) { // 形参
        // Promise接收一个回调函数 => 容器 => 里面保存着某个未来才会结束的事件（通常是一个异步操作,同步也可以)
        // 此函数属于同步任务 => 调用new Promise()时立即执行
        console.log(111111);

        setTimeout(function () {
            debugger;
            // var num = Math.random();
            var num = 0.9;
            console.log(num);

            if (num > 0.5) {
                // console.log("正面:不拖堂");
                resolve("不拖堂");  //  {<fulfilled>:不拖堂}
                reject("拖堂");  // {<rejected>:拖堂}
            } else {
                // console.log("反面:拖堂");
                reject("拖堂");  // {<rejected>:拖堂}
            }
            console.log("60:", p);

        }, 2000)

    });
    console.log("65:", p); // {<pending>:undefined}


</script>

</html>